/**
 * 功能： js版本事件总线-混入文件
 * this.eventBusMixinOn('updateUserInfo', (msg) => {})
 * this.eventBusMixinOnSticky('updateUserInfo', (msg) => {})
 * this.eventBusMixinOff();
 * this.eventBusMixinEmit("updateUserInfo",{data:"hahah"});
 * this.eventBusMixinEmitSticky("updateUserInfo",{data:"hahah"});
 * 
 * 作者： caihan
 * 日期:  2021-05-19
 */
import bus from '@/common/bus/bus.js';
var subscriberList = {}; //事件监听列表,在onShow的时候会去触发
var isOnShow = false;
const eventBusMixin = {
	data() {
		return {}
	},
	onLoad: function(option) {},
	onShow: function() {
		isOnShow = true;
		Object.keys(subscriberList).forEach(key => {
			let obj = subscriberList[key];
			obj.subscriber(obj.msg);
		})
		subscriberList = {};
	},
	onHide: function() {
		isOnShow = false;
	},
	onUnload: function() {
		this.eventBusMixinOff();
	},
	methods: {
		/**
		 * 注册一个事件(同一类型只能注册一次，即同一函数名称名称，只能注册一次)
		 * @param {Object} eventName 观察的对象事件类型，可确省,默认为 "defaultType"
		 * @param {Object} subscriber 订阅回调
		 */
		eventBusMixinOn(eventName, subscriber) {
			bus.on(this, eventName, (msg) => {
				if (isOnShow) return subscriber(msg);
				subscriberList[eventName] = {
					subscriber,
					msg
				};
			});
		},
		/**
		 * 注册一个粘性事件(同一类型只能注册一次，即同一函数名称名称，只能注册一次)
		 * @param {Object} eventName 观察的对象事件类型，可确省,默认为 "defaultType"
		 * @param {Object} subscriber 订阅回调
		 */
		eventBusMixinOnSticky(eventName, subscriber) {
			bus.onSticky(this, eventName, subscriber);
		},
		//移除页面所有监听事件
		eventBusMixinOff() {
			bus.off(this);
		},
		/**
		 * 发送事件消息
		 * @param {Object} eventName 事件类型
		 * @param {Object} msg 消息
		 */
		eventBusMixinEmit(eventName, msg) {
			bus.emit(eventName, msg);
		},
		/**
		 * 发送粘性事件（消息，同一个类型，只保留最后一个）
		 * @param {Object} eventName 事件类型
		 * @param {Object} msg 消息
		 */
		eventBusMixinEmitSticky(eventName, msg) {
			bus.emitSticky(eventName, msg);
		},
	}
}

export default eventBusMixin;
